﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using GEA_Controle_Processos.Data;
using GEA_Controle_Processos.Data.Dados;

namespace GEA_Controle_Processos.Data.Negocio
{
    [System.ComponentModel.DataObject(true)]
    public class NegocioCliente
    {
        private readonly IRepositorioGenerico<Cliente, BD_GerenciadorVendasEntities> repositorioCliente;
        private NegocioEndereco negocioEndereco;
        public NegocioCliente()
        {
            repositorioCliente = new RepositorioGenerico<Cliente, BD_GerenciadorVendasEntities>("chave");
            negocioEndereco = new NegocioEndereco();
        }

        /// <summary>
        /// Retorna Todos Clientes
        /// Cadastrados na base de dados
        /// </summary>
        /// <returns></returns>
        public List<Cliente> ObterTodos()
        {
            return repositorioCliente.ObterTodos().ToList();
        }

        /// <summary>
        /// Retorna uma possivel lista de clientes que contenham
        /// o nome ou apelido passado como parametro, ou um cliente que contenha o cpf 
        /// passado como parametro
        /// </summary>
        /// <param name="nome"></param>
        /// <param name="cprf"></param>
        /// <returns></returns>
        [System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Select)]
        public List<Cliente> ObterNome_Apelido_Cpf(string nome,string apelido ,string cpf)
        {
            if (cpf != null && cpf != "" )
                return repositorioCliente.Obter(cliente => cliente.cpf.Contains(cpf)).ToList();
            else
            {
                if (apelido != null && apelido !=  "")
                    return repositorioCliente.Obter(cliente => cliente.apelido.Contains(apelido)).ToList();
                else
                {
                    if (nome != null && nome !="")
                        return repositorioCliente.Obter(cliente => cliente.nome.Contains(nome)).ToList();
                    else
                        return repositorioCliente.Obter(cliente => cliente.nome.Contains("")).ToList();
                }

            }

        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="idCliente"></param>
        /// <returns></returns>
        [System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Select)]
        public Cliente Obter(int idCliente)
        {
            return repositorioCliente.ObterEntidade(cliente => cliente.IdCliente == idCliente);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="cpf"></param>
        /// <returns></returns>
        [System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Select)]
        public Cliente ObterCpf(string cpf)
        {
            try
            {
                return (Cliente)repositorioCliente.ObterEntidade(cliente => cliente.cpf.Contains(cpf));
            }
            catch
            {
                return null;
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="cliente"></param>
        /// <returns></returns>
        [System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Insert)]
        public Boolean Inserir(Cliente cliente)
        {
            repositorioCliente.Inserir(cliente);
            return repositorioCliente.SaveChanges() > 0;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="cliente"></param>
        /// <returns></returns>
        public bool Update(Cliente cliente)
        {
            Cliente cli = new Cliente();
            cli = ObterCpf(cliente.cpf);
            Endereco endereco = new Endereco();
            endereco = negocioEndereco.ObterEndereco(cli.Endereco_idEndereco);
            Cidade cid = new Cidade();
            cid = negocioEndereco.ObterCidade(endereco.Cidade_idCidade);           
            cli.apelido = cliente.apelido;
            cli.celular = cliente.celular;
            cli.cpf = cliente.cpf;
            cli.dataAlteracao = DateTime.Now.Date;
            cli.datanascimento = cliente.datanascimento;
            cli.dependentes = cliente.dependentes;
            cli.email = cliente.email;
            cli.estadoCivil = cliente.estadoCivil;
            cli.nome = cliente.nome;
            cli.usuarioAlteracao = "";
            cli.Endereco = endereco;
            cli.Endereco.Cidade = cid;
            endereco = null;
            cli = null;
            cid = null;
            return repositorioCliente.SaveChanges() > 0;

        }

    }
}
